package com.logos.musicframe.utils;

import lombok.extern.slf4j.Slf4j;
import org.jaudiotagger.audio.AudioFile;
import org.jaudiotagger.audio.AudioFileIO;
import org.jaudiotagger.audio.exceptions.CannotReadException;
import org.jaudiotagger.audio.exceptions.InvalidAudioFrameException;
import org.jaudiotagger.audio.exceptions.ReadOnlyFileException;
import org.jaudiotagger.tag.TagException;

import java.io.File;
import java.io.IOException;

/**
 * 音频文件处理工具类
 * 
 * @author logos
 * @since 2025-06-14
 */
@Slf4j
public class AudioUtils {

    /**
     * 获取音频文件的时长（秒）
     *
     * @param file 音频文件
     * @return 时长（秒），如果获取失败则返回0
     */
    public static int getAudioDuration(File file) {
        if (file == null || !file.exists()) {
            log.error("音频文件不存在");
            return 0;
        }

        try {
            AudioFile audioFile = AudioFileIO.read(file);
            int durationInSeconds = audioFile.getAudioHeader().getTrackLength();
            log.info("音频文件 {} 的时长为 {} 秒", file.getName(), durationInSeconds);
            return durationInSeconds;
        } catch (CannotReadException | IOException | TagException | ReadOnlyFileException | InvalidAudioFrameException e) {
            log.error("获取音频文件时长失败: {}", e.getMessage());
            return 0;
        }
    }

    /**
     * 判断文件是否为支持的音频格式
     *
     * @param file 文件
     * @return 是否为支持的音频格式
     */
    public static boolean isSupportedAudioFormat(File file) {
        if (file == null || !file.exists()) {
            return false;
        }
        
        String fileName = file.getName().toLowerCase();
        return fileName.endsWith(".mp3") || fileName.endsWith(".wav") || fileName.endsWith(".flac");
    }
    
    /**
     * 获取音频文件格式
     *
     * @param file 音频文件
     * @return 文件格式（mp3, wav, flac），如果不是支持的格式则返回空字符串
     */
    public static String getAudioFormat(File file) {
        if (file == null || !file.exists()) {
            return "";
        }
        
        String fileName = file.getName().toLowerCase();
        if (fileName.endsWith(".mp3")) {
            return "mp3";
        } else if (fileName.endsWith(".wav")) {
            return "wav";
        } else if (fileName.endsWith(".flac")) {
            return "flac";
        } else {
            return "";
        }
    }
    
    /**
     * 格式化音频时长为 mm:ss 格式
     *
     * @param seconds 时长（秒）
     * @return 格式化后的时长字符串
     */
    public static String formatDuration(int seconds) {
        int minutes = seconds / 60;
        int remainingSeconds = seconds % 60;
        return String.format("%02d:%02d", minutes, remainingSeconds);
    }
} 